/* 
	Grupo 2

	Alunos: 
		Luis Felipe Souza de Mattos   RA: 107822
	
		Debora Maia Silva 	      RA: 101985
*/

#include "lista.h"
#include <stdlib.h>
#include <stdio.h>

/* funcoes de criacao das listas vazias */
ListaSimples* CriaListaSimples(void)
{
	return NULL;
}

ListaDupla* CriaListaDupla(void)
{
	return NULL;
}

/* Inserindo uma celula na lista simples */
void InsereListaSimples (ListaSimples **inicio, int numero) 
{
	ListaSimples* ultimo;
	ListaSimples* aux;
	aux = *inicio;

	/* inserindo em lista vazia  */
	if(*inicio == NULL)
	{
	   aux = (ListaSimples*)malloc(sizeof(ListaSimples));
	   aux->pessoa = numero;
	   *inicio = aux;
	   aux->prox = *inicio;
	}

	/* a lista nao sendo vazia, deve-se percorre-la para encontrar a ultima posicao e depois inserir */
	else
	{
	   ultimo = *inicio;

	   /* o ultimo apontara para o primeiro na lista circular */
	   while(ultimo->prox != *inicio)
	      ultimo = ultimo->prox;
	
	   aux = (ListaSimples*)malloc(sizeof(ListaSimples));
	   aux->pessoa = numero;
	   aux->prox = *inicio;
	   ultimo->prox = aux;
	}	
}

/* Inserindo uma celula na lista duplamente encadeada */
void InsereListaDupla (ListaDupla **inicio, int numero)
{
	ListaDupla* ultimo;
	ListaDupla* aux;
	aux = *inicio;

	/* inserindo em lista vazia */
	if (*inicio == NULL)
	{
	   aux = (ListaDupla*)malloc(sizeof(ListaDupla));
	   aux->pessoa = numero;
	   *inicio = aux;
	   aux->hor = *inicio;
	   aux->antihor = *inicio;
	}
	/* inserindo em lista nao vazia */
	else
	{
	   ultimo = *inicio;
		
	   /* percorre em sentido horario para achar o ultimo elemento que foi inserido
	   este ultimo estara apontando para o inicio da lista		            */
	   while(ultimo->hor != *inicio)
	      ultimo = ultimo->hor;

	   aux = (ListaDupla*)malloc(sizeof(ListaDupla));
	   aux->pessoa = numero;
	   aux->antihor = ultimo;
	   aux->hor = *inicio;
	   ultimo->hor = aux;
	   (*inicio)->antihor = aux;
	}
}

/* monta a lista simples com n pessoas */
void MontaListaSimples(ListaSimples **inicio,int n)
{
   int i;
   
   *inicio = CriaListaSimples();

   for (i = 0;i < n;i++)
      InsereListaSimples(inicio,i);
}

/* monta a lista duplamente encadeada com n pessoas */
void MontaListaDupla(ListaDupla **inicio,int n)
{
   int i;
   
   *inicio = CriaListaDupla();

   for (i = 0;i < n;i++)
      InsereListaDupla(inicio,i);
}

